//航班预订统计
// 这里有 n 个航班，它们分别从 1 到 n 进行编号。
// 有一份航班预订表 bookings ，
// 表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi]
// 测试链接 : https://leetcode.cn/problems/corporate-flight-bookings/
class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        //原数组（多开两个）
        vector<int> tmp(n+2);       //防止边界情况讨论
        //遍历二维数组
        //[left,right,seat]  
        //相当于在[left,right] +=seat
        for(auto a:bookings)
        {
            tmp[a[0]]+=a[2];
            tmp[a[1]+1]-=a[2];
        }
        //原数组:tmp
        //0 1  2   3
        //-----------
        //0 0  0   0
        //0 10 0  -10
        //0 10 15 -25
        //前缀和:sum
        //0 10 25  0
        vector<int> sum(n+2); 
        sum[0]=tmp[0];
        for(int i=1;i<n+2;i++)
        {
            sum[i]=sum[i-1]+tmp[i];
        }
        //返回ret:10 25  就是[1,n]
        vector<int> ret(n); 
        for(int i=0;i<n;i++)
        {
            ret[i]=sum[i+1];
        }
        return ret;
    }
};


class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        //原数组（多开两个）
        vector<int> tmp(n+2);       //防止边界情况讨论
        //遍历二维数组
        //[left,right,seat]  
        //相当于在[left,right] +=seat
        for(auto a:bookings)
        {
            tmp[a[0]]+=a[2];
            tmp[a[1]+1]-=a[2];
        }
        //原数组:tmp
        //0 1  2   3
        //-----------
        //0 0  0   0
        //0 10 0  -10
        //0 10 15 -25
        
        //处理前缀和
        //处理1
        for(int i=1;i<tmp.size();i++)
        {
            tmp[i]+=tmp[i-1];   //0 10 15 -25 变 0 10 25 0
        }
        // 处理2 截取
        // 0 10 25 0 -> 10 25
        vector<int> sum(n); 
        for(int i=0;i<n;i++)
        {
            sum[i]=tmp[i+1];
        }
        return sum;
    }
};